package com.ruoyi.auth.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Component
// @Component 把当前类暴露给springboot容器,当项目启动时 会对该类创建对象放入容器中
public class RedisUtils {

    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * redis基本指令    set
     * @param key 键
     * @param val 值
     * @return 返回是否插入成功
     */
    public boolean set(String key, Object val){
        try {
            redisTemplate.opsForValue().set(key,val);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * redis基本指令    get
     * @param key 键值
     * @return 返回值
     */
    public Object get(String key){
        try {
            return redisTemplate.opsForValue().get(key);
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    /**
     * redis基本指令    move
     * @param key       移除的键
     * @param dbIndex   那个数据库
     * @return 移除的结果
     */
    public Boolean move(String key,int dbIndex){
        try{
            return redisTemplate.move(key,dbIndex);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * redis基本指令    exists
     * @param key  需要判断的键
     * @return 返回是否存在这个键
     */
    public Boolean exists(String key){
        try{
            return redisTemplate.hasKey(key);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * redis基本指令    expire
     * @param key     键
     * @param seconds 设置的秒数
     * @return 是否设置成功
     */
    public Boolean expire(String key,long seconds){
        try {
            return redisTemplate.expire(key,seconds, TimeUnit.SECONDS);
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * redis基本指令    ttl
     * @param key 键
     * @return 返回该键的剩余时间 -1表示没有设置时间 -2表示不存在这个键 -3表示发生错误
     */
    public Long ttl(String key){
        try {
            return redisTemplate.getExpire(key,TimeUnit.SECONDS);
        }catch (Exception e){
            e.printStackTrace();
            return -3L;
        }
    }

    /**
     * redis基本指令    incr
     * @param key 自增
     * @return 返回+1后的值
     */
    public Long incr(String key){
        return redisTemplate.opsForValue().increment(key);
    }

    /**
     * redis基本指令    decr
     * @param key 自减
     * @return 返回-1后的值
     */
    public Long decr(String key){
        return redisTemplate.opsForValue().decrement(key);
    }

    /**
     * redis基本指令    setEx
     * @param key  设置的键
     * @param val  设置的值
     * @param time 设置是时间 单位秒
     * @return 返回是否设置成功
     */
    public Boolean setExpire(String key,String val,Long time){
        try{
            redisTemplate.opsForValue().set(key,val,time,TimeUnit.SECONDS);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
}
